home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Special 26 / AMIGAplus Sonderheft 26 (2000)(Falke)(DE)(Track 1 of 2)[!].iso / Updates / HD-Installer / -WHDLoad- / WHDLoad_dev / Patcher1.05dev.lha / Patcher1.05 / PARAMQTX / paramcarriercommand.asm < prev    next >
Assembly Source File  |  1998-01-14  |  11KB  |  491 lines

  1. ;THAT IS A MORE 'HISTORICAL' FIX, USE WHDLOAD OR JST NOW IF YOU INSTALL
  2. ;NON-OS GAMES!
  3. ;fixed: codeprotection removed
  4. ;    illegal access to a memoryplace $fcxxxx caused a crash
  5. ;      on 68030+ (mmu?), moreover it was useless, possibly
  6. ;      a freezertest
  7. ;    diskroutines contained dbf-delays, now vbi-synced or 
  8. ;      removed
  9.  
  10. ;This is an example of a formatconversion.
  11. ;At first it formats a disk and creates a directory S. (cycle 1)
  12. ;Then it gets the data from the original disk. (cycle2)
  13. ;These data can be read only index-synchronized with OS1.3.
  14. ;Therefore here is a strange decoding routine.
  15. ;Then these data will be modified by changes and saved as file.
  16. ;A proper startup-sequence will be added. (cycle3)
  17.  
  18.     INCDIR    ASM-ONE:INCLUDE2.0/
  19.  
  20.     INCLUDE    OWN/Patcher.I
  21.     INCLUDE    DEVICES/TRACKDISK.I
  22.     INCLUDE    EXEC/EXEC_LIB.I
  23.     INCLUDE    EXEC/IO.I
  24.     INCLUDE    LIBRARIES/DOS_LIB.I
  25.  
  26. HP    MOVEQ.L    #20,D0
  27.     RTS
  28.     DC.L    TAB
  29.     DC.B    'PTCH'
  30.     DC.B    '$VER:CARRIER_COMMAND_1.0',0
  31.     EVEN
  32.  
  33. TAB    DC.L    PCH_INIT,INITROUT
  34.     DC.L    PCH_FILECOUNT,3
  35.     DC.L    PCH_ADAPTOR,ADNAME
  36.     DC.L    PCH_DISKNAME,DISKNAMEARRAY
  37.     DC.L    PCH_FILENAME,FILENAMEARRAY
  38.     DC.L    PCH_CHANGES,CHANGESARRAY    
  39.     DC.L    PCH_NAME,PARAMNAME
  40.     DC.L    PCH_DATALENGTH,LENGTHTABLE
  41.     DC.L    PCH_SAVEDATA,DATATABLE
  42.     DC.L    PCH_SPECIAL,SPECIALARRAY
  43.     DC.L    PCH_STATE,STATEARRAY
  44.     DC.L    PCH_STATE2,STATEARRAY2
  45.     DC.L    0
  46.  
  47. ADNAME    DC.B    'Fixed by Harry.',0
  48.     EVEN
  49.  
  50.  
  51. PARAMNAME    DC.B    'Carrier Command V1.2',0
  52.     EVEN
  53.  
  54.  
  55. DISKNAMEARRAY    DC.L    0        ;no name for formatting a disk
  56.     DC.L    DISK1NAME        ;to save the read data on the 
  57.     DC.L    DISK1NAME        ;newly formatted disk
  58.  
  59. DISK1NAME    DC.B    'CarrierCommand',0
  60.     EVEN
  61.  
  62.  
  63. FILENAMEARRAY    DC.L    0        ;no filename needed to format a disk
  64.     DC.L    FILE2NAME        ;filename of the mainprogram
  65.     DC.L    FILE3NAME        ;adding a startup-sequence
  66. FILE2NAME    DC.B    'CarrierCommand',0
  67.     EVEN
  68. FILE3NAME    DC.B    'S/Startup-Sequence',0
  69.     EVEN
  70.  
  71. LENGTHTABLE    DC.L    $1600        ;just a space of $1600 for personal use
  72.     DC.L    360076            ;save-length (theres a customloadingroutine)
  73.     DC.L    DATA3END-DATA3        ;length of the startup
  74.  
  75. DATATABLE    DC.L    0        ;no unread data to save
  76.     DC.L    0            ;no unread data to save
  77.     DC.L    DATA3            ;startup-sequence to add
  78.  
  79. DATA3    DC.B    'CarrierCommand',$a
  80. DATA3END
  81.     EVEN
  82.  
  83. CHANGESARRAY    DC.L    0        ;no changes to make in cycle 1
  84.     DC.L    CHANGE2            ;changes to the data read from the original
  85.     DC.L    0            ;no changes to make in cycle 3
  86.  
  87. CHANGE2
  88.     DC.B    $00,$80,$00,$00,$4C,$00,$00,$03
  89.     DC.B    $F3,$00,$00,$00,$00,$00,$00,$00
  90.     DC.B    $02,$00,$00,$00,$00,$00,$00,$00
  91.     DC.B    $01,$00,$01,$5F,$89,$40,$00,$00
  92.     DC.B    $01,$00,$00,$03,$E9,$00,$01,$5F
  93.     DC.B    $89,$4E,$F9,$00,$05,$7D,$28,$46
  94.     DC.B    $FC,$27,$00,$2E,$7C,$00,$05,$86
  95.     DC.B    $AA,$4E,$B9,$00,$01,$A0,$EC,$50
  96.     DC.B    $F8,$12,$0F,$50,$F8,$22,$9C,$31
  97.     DC.B    $FC,$00,$04,$22,$9E,$4E,$F8,$5F
  98.     DC.B    $50,$80,$70,$3A,$06,$00,$40,$61
  99.     DC.B    $00,$04,$06,$80,$70,$D6,$06,$76
  100.     DC.B    $01,$61,$00,$03,$6A,$00,$70,$DF
  101.     DC.B    $FA,$80,$71,$6B,$09,$7F,$61,$00
  102.     DC.B    $02,$D6,$08,$2E,$00,$01,$00,$00
  103.     DC.B    $71,$75,$1F,$80,$71,$C4,$08,$00
  104.     DC.B    $10,$61,$00,$02,$7C,$4E,$71,$80
  105.     DC.B    $74,$26,$08,$30,$3C,$00,$B4,$08
  106.     DC.B    $39,$00,$00,$80,$74,$2F,$09,$DF
  107.     DC.B    $F0,$05,$66,$F6,$08,$39,$00,$00
  108.     DC.B    $00,$80,$74,$39,$1B,$DF,$F0,$05
  109.     DC.B    $67,$F6,$51,$C8,$FF,$EA,$4E,$75
  110.     DC.B    $4E,$71,$4E,$71,$08,$39,$00,$00
  111.     DC.B    $00,$DF,$F0,$05,$66,$F6,$08,$39
  112.     DC.B    $00,$80,$74,$55,$09,$00,$00,$DF
  113.     DC.B    $F0,$05,$67,$F6,$4E,$75,$00,$00
  114.     DC.B    $AE,$80,$00,$00,$AE,$A0,$00,$00
  115.     DC.B    $AE,$B0,$00,$00,$AE,$C0,$00,$00
  116.     DC.B    $AE,$E0,$00,$00,$AE,$F0,$00,$00
  117.     DC.B    $AF,$10,$00,$00,$AF,$20,$00,$00
  118.     DC.B    $AF,$40,$00,$00,$AF,$50,$00,$00
  119.     DC.B    $AF,$60,$00,$00,$C7,$C3,$18,$80
  120.     DC.B    $C7,$C8,$04,$12,$C1,$4E,$71,$81
  121.     DC.B    $9D,$52,$0C,$4E,$71,$4E,$71,$4E
  122.     DC.B    $71,$4E,$71,$4E,$71,$4E,$71,$81
  123.     DC.B    $A5,$AC,$08,$4E,$B9,$00,$00,$77
  124.     DC.B    $F8,$4E,$71,$85,$7D,$4C,$02,$2C
  125.     DC.B    $78,$85,$7D,$4F,$03,$04,$43,$FA
  126.     DC.B    $00,$85,$7D,$53,$02,$6A,$70,$85
  127.     DC.B    $7D,$56,$06,$4E,$AE,$FD,$D8,$23
  128.     DC.B    $C0,$85,$7D,$5D,$04,$05,$7D,$AA
  129.     DC.B    $67,$85,$7D,$63,$05,$3E,$61,$6C
  130.     DC.B    $2C,$78,$00,$85,$7D,$69,$08,$04
  131.     DC.B    $4E,$AE,$FF,$6A,$46,$FC,$27,$85
  132.     DC.B    $7D,$72,$03,$4F,$F8,$01,$00,$85
  133.     DC.B    $7D,$76,$FF,$33,$FC,$7F,$FF,$00
  134.     DC.B    $DF,$F0,$9A,$33,$FC,$7F,$FF,$00
  135.     DC.B    $DF,$F0,$96,$41,$F9,$00,$00,$00
  136.     DC.B    $06,$43,$F8,$03,$DE,$20,$3C,$00
  137.     DC.B    $01,$5F,$49,$22,$D8,$53,$80,$66
  138.     DC.B    $FA,$4E,$F8,$03,$DE,$4A,$B9,$00
  139.     DC.B    $05,$7D,$AA,$67,$0C,$2C,$78,$00
  140.     DC.B    $04,$22,$7A,$00,$20,$4E,$AE,$FE
  141.     DC.B    $62,$70,$14,$4E,$75,$00,$00,$00
  142.     DC.B    $00,$67,$72,$61,$70,$68,$69,$63
  143.     DC.B    $73,$2E,$6C,$69,$62,$72,$61,$72
  144.     DC.B    $79,$00,$00,$00,$00,$00,$00,$2C
  145.     DC.B    $7A,$FF,$FA,$23,$EE,$00,$22,$00
  146.     DC.B    $05,$7D,$94,$32,$7C,$00,$00,$4E
  147.     DC.B    $AE,$FF,$22,$4E,$AE,$FE,$F2,$4E
  148.     DC.B    $AE,$FE,$F2,$41,$F9,$00,$00,$00
  149.     DC.B    $00,$23,$C8,$00,$DF,$F0,$80,$30
  150.     DC.B    $39,$00,$DF,$F0,$04,$02,$40,$00
  151.     DC.B    $01,$67,$F4,$30,$39,$00,$DF,$F0
  152.     DC.B    $04,$02,$40,$00,$01,$66,$F4,$30
  153.     DC.B    $39,$00,$DF,$F0,$04,$02,$40,$00
  154.     DC.B    $01,$67,$F4,$30,$39,$00,$DF,$F0
  155.     DC.B    $04,$02,$40,$00,$01,$66,$F4,$30
  156.     DC.B    $39,$00,$DF,$F0,$7C,$0C,$00,$00
  157.     DC.B    $F8,$66,$10,$33,$FC,$00,$00,$00
  158.     DC.B    $DF,$F1,$FC,$33,$FC,$0C,$01,$00
  159.     DC.B    $DF,$F1,$06,$4E,$75,$00,$00,$03
  160.     DC.B    $EC,$00,$00,$00,$05,$00,$00,$00
  161.     DC.B    $00,$00,$00,$00,$02,$00,$05,$7D
  162.     DC.B    $38,$00,$05,$7D,$64,$00,$05,$7D
  163.     DC.B    $7E,$00,$05,$7D,$B6,$00,$00,$00
  164.     DC.B    $01,$00,$00,$00,$01,$00,$05,$7D
  165.     DC.B    $CC,$00,$00,$85,$7E,$75,$17,$00
  166.     DC.B    $00,$00,$00,$00,$03,$F2,$00,$00
  167.     DC.B    $03,$EA,$00,$00,$00,$01,$FF,$FF
  168.     DC.B    $FF,$FE,$00,$00,$03,$F2,$00,$40
  169.     DC.B    $00,$00
  170.  
  171.     EVEN
  172.  
  173.  
  174. ;the parameter-initializing opens source- and destinationdevice, 
  175. ;both are needed
  176. INITROUT    MOVEQ.L    #0,D0
  177.     MOVE.L    PTB_OPENDEVICE(A5),A0
  178.     JSR    (A0)
  179.     TST.L    D0
  180.     BEQ.S    .1
  181.     RTS
  182.  
  183. .1    MOVEQ.L    #1,D0
  184.     MOVE.L    PTB_OPENDEVICE(A5),A0
  185.     JSR    (A0)
  186.     RTS    
  187.  
  188. ;loading-statetexts for the cycles
  189. STATEARRAY    DC.L    FORMATSTATE1    ;i programmed the formatting in the
  190.                     ;loading-routine and i'm to lazy to change that
  191.     DC.L    LOADSTATE2
  192.     DC.L    SAVESTATE
  193.  
  194. FORMATSTATE1
  195.     DC.B    'Please insert an empty dd-disk',$a
  196.     DC.B    'in your destination drive.',0
  197.     EVEN
  198.  
  199. LOADSTATE2
  200.     DC.B    'Please insert your original writepro-',$A
  201.     DC.B    'tected disk in the source drive.',0
  202.     EVEN
  203.  
  204. STATEARRAY2    DC.L    0        ;no text in cycle 1
  205.     DC.L    SAVESTATE
  206.     DC.L    SAVESTATE
  207.  
  208.  
  209. SAVESTATE    
  210.     DC.B    'Please insert your destination disk.',0
  211.     EVEN
  212.  
  213. ;routines to 'load' something
  214. SPECIALARRAY    DC.L    FORMAT        ;more correctly this would be put to
  215.                     ;PCH_SAVEPGM, but i'm to lazy
  216.     DC.L    LOADROUT        ;load stuff from original
  217.     DC.L    0            ;nothing special in cycle 3
  218.  
  219.  
  220. FORMAT
  221.     MOVEQ.L    #0,D0            ;format dd-disk in destination-drive
  222.     LEA.L    DISK1NAME(PC),A0
  223.     MOVE.L    PTB_FORMATDEST(A5),A1
  224.     JSR    (A1)
  225.     TST.L    D0
  226.     BEQ.S    .1
  227. .ERR    MOVEQ.L    #-1,D0
  228.     RTS
  229.  
  230. .1    MOVE.L    #DIRNAME,D1        ;and create a 's'-drawer
  231.     MOVE.L    PTB_DOSBASE(A5),A6
  232.     JSR    _LVOCREATEDIR(A6)
  233.     TST.L    D0
  234.     BEQ.S    .ERR
  235.     MOVE.L    D0,D1
  236.     JSR    _LVOUNLOCK(A6)
  237.     MOVEQ.L    #0,D0
  238.     RTS
  239.  
  240.  
  241. DIRNAME    DC.B    'CarrierCommand:S',0
  242.     EVEN
  243.  
  244. LOADROUT
  245.     MOVEQ.L    #0,D7                ;one diskchange allowed
  246. .NEU
  247. .4    MOVE.L    PTB_DEVICESOURCEPTR(A5),A1    ;disk in sourcedrive?
  248.     MOVE.W    #TD_CHANGESTATE,IO_COMMAND(A1)
  249.     MOVE.L    (_SYSBASE).W,A6
  250.     JSR    _LVODOIO(A6)
  251.     TST.L    IO_ACTUAL(A1)
  252.     BNE.W    .NOTCC
  253.  
  254.     MOVE.L    PTB_ADDRESSOFFILE(A5),A4    ;load first part of disk
  255.     LEA.L    $4C(A4),A2            ;offset to load in the dataspace
  256.     MOVE.L    #$9,D2                ;starttrack on the disk
  257.     MOVE.L    #$50000,D3            ;$50000 bytes to read
  258.     MOVEQ.L    #0,D4                ;data from the start of the track
  259. ;    bra.s    .5                ;because reading starts with
  260.                         ;trackstart, this is obsolete
  261.  
  262. .3    TST.L    D4
  263.     BNE.S    .1
  264. .5    MOVEQ.L    #$4,D6                ;4 tries, then error
  265. .55    MOVE.L    PTB_DEVICESOURCEPTR(A5),A1
  266.     MOVE.L    PTB_SPACE(A5),IO_DATA(A1)    ;track is to load in PTB_SPACE
  267.     MOVE.L    #$7FFE,IO_LENGTH(A1)        ;double length of track
  268.                         ;to decode the index-sync-read data
  269.     MOVE.L    D2,D0                ;my own trackcounter
  270.     ADD.L    D0,D0                ;original is one-sided
  271.     MOVE.L    D0,IO_OFFSET(A1)
  272.     MOVE.W    #TD_RAWREAD,IO_COMMAND(A1)
  273.     MOVE.B    #IOTDB_INDEXSYNC,IO_FLAGS(A1)
  274.     MOVE.L    (_SYSBASE).W,A6
  275.     JSR    _LVODOIO(A6)
  276.     TST.L    D0
  277.     BNE.W    .ERR
  278.     MOVE.L    PTB_SPACE(A5),A0
  279.     LEA.L    $7FFE(A0),A1            ;end of buffer
  280.     LEA.L    $7FFE(A0),A3
  281.     BSR.W    TRACKDECODE
  282.     TST.L    D0
  283.     BEQ.S    .R1OK
  284.     DBF    D6,.55
  285.     BRA.W    .NOTCC
  286.  
  287. .R1OK    ADDQ.L    #1,D2
  288.     ST    D7                ;correct disk - nothing anymore
  289.                         ;to change
  290. .1    MOVE.B    (A3)+,(A2)+
  291.     ADDQ.L    #1,D4
  292.     CMP.L    #$1400,D4            ;tracklength
  293.     BNE.S    .2
  294.     MOVEQ.L    #0,D4                ;new track
  295. .2    SUBQ.L    #1,D3
  296.     BNE.S    .3
  297.  
  298.     LEA.L    (A4),A2
  299.     ADDA.L    #$4FFB4+$22,A2            ;second part to read from the
  300.     MOVE.L    #$2,D2                ;original
  301.     MOVE.L    #32160,D3
  302.     MOVEQ.L    #0,D4
  303. .13    TST.L    D4
  304.     BNE.S    .11
  305.     MOVEQ.L    #$4,D6
  306. .REP    MOVE.L    PTB_DEVICESOURCEPTR(A5),A1
  307.     MOVE.L    PTB_SPACE(A5),IO_DATA(A1)
  308.     MOVE.L    #$7FFE,IO_LENGTH(A1)
  309.     MOVE.L    D2,D0
  310.     ADD.L    D0,D0
  311.     MOVE.L    D0,IO_OFFSET(A1)
  312.     MOVE.W    #TD_RAWREAD,IO_COMMAND(A1)
  313.     MOVE.B    #IOTDB_INDEXSYNC,IO_FLAGS(A1)
  314.     MOVE.L    (_SYSBASE).W,A6
  315.     JSR    _LVODOIO(A6)
  316.     TST.L    D0
  317.     BNE.S    .ERR
  318.     MOVE.L    PTB_SPACE(A5),A0
  319.     LEA.L    $7FFE(A0),A1
  320.     LEA.L    $7FFE(A0),A3
  321.     BSR.W    TRACKDECODE
  322.     TST.L    D0
  323.     BEQ.S    .R2OK
  324.     DBF    D6,.REP
  325.     BRA.S    .ERR
  326.  
  327. .R2OK    ADDQ.L    #1,D2
  328.  
  329. .11    MOVE.B    (A3)+,(A2)+
  330.     ADDQ.L    #1,D4
  331.     CMP.L    #$1400,D4
  332.     BNE.S    .12
  333.     MOVEQ.L    #0,D4
  334. .12    SUBQ.L    #1,D3
  335.     BNE.S    .13
  336.  
  337.     MOVEQ.L    #0,D4
  338. .END    MOVE.L    PTB_DEVICESOURCEPTR(A5),A1    ;switch motor off
  339.     MOVE.L    #0,IO_LENGTH(A1)
  340.     MOVE.W    #TD_MOTOR,IO_COMMAND(A1)
  341.     MOVE.L    (_SYSBASE).W,A6
  342.     JSR    _LVODOIO(A6)
  343.  
  344.     MOVE.L    D4,D0
  345.     RTS
  346.  
  347. .ERR    MOVEQ.L    #-1,D4
  348.     BRA.S    .END
  349.  
  350. .NOTCC    TST.L    D7            ;if the first time the original
  351.     BNE.S    .ERR            ;was not in the source drive,
  352.     ST    D7            ;youll be asked to put it there
  353.     LEA.L    LINE1(PC),A0
  354.     LEA.L    LINE2(PC),A1
  355.     MOVE.L    PTB_REQUEST(A5),A6
  356.     JSR    (A6)
  357.     TST.L    D0
  358.     BNE.S    .ERR
  359.     BRA.W    .NEU
  360.  
  361. LINE1    DC.B    'Please insert your original',0
  362.     EVEN
  363. LINE2    DC.B    'in the source drive.',0
  364.     EVEN
  365.  
  366. ;< A0 RAWTRACK
  367. ;< A1 TRACKBUFFER
  368. ;> D0 ERROR
  369.  
  370. TRACKDECODE    MOVEM.L    A2/A3/D2/D3/D4/D5/D6,-(A7)
  371.     MOVE.L    A0,A2
  372.     MOVE.L    A1,A3
  373.     MOVE.W    #$4489,-2(A3)        ;sync has to be searched with shifting
  374.     MOVE.L    #$55555555,D3        ;the data
  375. .SHF2    MOVEQ.L    #$10-1,D5
  376. .SHF1    MOVE.L    (A2),D0
  377.     LSR.L    D5,D0
  378.     CMP.W    #$4489,D0
  379.     BEQ.S    .SY
  380.     DBF    D5,.SHF1
  381.     ADDQ.L    #2,A2
  382.     BRA.S    .SHF2
  383.  
  384. .SY    MOVE.L    (A2),D0
  385.     ADDQ.L    #2,A2
  386.     LSR.L    D5,D0            ;d5 is the shifting-number when sync was found
  387.     CMP.W    #$4489,D0
  388.     BNE.S    .SY
  389.  
  390. .1    MOVE.L    (A2),D0
  391.     ADDQ.L    #2,A2
  392.     LSR.L    D5,D0
  393.     CMP.W    #$4489,D0
  394.     BEQ.S    .1
  395.  
  396.     CMP.L    A2,A3
  397.     BLS    .ERR
  398.     SUBQ.W    #2,A2
  399.     LEA.L    8(A2),A0
  400.     BSR.S    .DC1L
  401.     MOVE.L    D0,D4
  402.     LEA.L    $10(A2),A0
  403.     MOVE.W    #$2800,D1
  404.     BSR.S    .CHKSUM
  405.     CMP.L    D0,D4
  406.     BNE.S    .ERR
  407.     LEA.L    $10(A2),A0
  408.     MOVE.W    #$1400,D0
  409.     BSR.W    .DC
  410.     MOVEM.L    (A7)+,A2/A3/D2/D3/D4/D5/D6
  411.     MOVEQ    #0,D0
  412.     RTS    
  413.  
  414. .ERR    MOVEM.L    (A7)+,A2/A3/D2/D3/D4/D5/D6
  415.     MOVEQ    #-1,D0
  416.     RTS    
  417.  
  418. .CHKSUM    LSR.W    #2,D1
  419.     MOVE.L    (A0)+,D6
  420.     LSR.L    D5,D6
  421.     SWAP    D6
  422.     CLR.W    D6
  423.     MOVE.L    -2(A0),D0
  424.     LSR.L    D5,D0
  425.     AND.L    #$FFFF,D0
  426.     OR.L    D6,D0
  427.     SUBQ.W    #2,D1
  428. .CHK1    MOVE.L    (A0)+,D6
  429.     LSR.L    D5,D6
  430.     SWAP    D6
  431.     CLR.W    D6
  432.     MOVE.L    -2(A0),D2
  433.     LSR.L    D5,D2
  434.     AND.L    #$FFFF,D2
  435.     OR.L    D6,D2
  436.     EOR.L    D2,D0
  437.     DBF    D1,.CHK1
  438.     AND.L    D3,D0
  439.     RTS    
  440.  
  441. .DC1L    MOVE.L    (A0)+,D6
  442.     LSR.L    D5,D6
  443.     SWAP    D6
  444.     CLR.W    D6
  445.     MOVE.L    -2(A0),D0
  446.     LSR.L    D5,D0
  447.     AND.L    #$FFFF,D0
  448.     OR.L    D6,D0
  449.     MOVE.L    (A0)+,D6
  450.     LSR.L    D5,D6
  451.     SWAP    D6
  452.     CLR.W    D6
  453.     MOVE.L    -2(A0),D1
  454.     LSR.L    D5,D1
  455.     AND.L    #$FFFF,D1
  456.     OR.L    D6,D1
  457.     
  458.     AND.L    D3,D0
  459.     AND.L    D3,D1
  460.     ADD.L    D0,D0
  461.     OR.L    D1,D0
  462.     RTS    
  463.  
  464. .DC    LEA.L    (A0,D0.W),A1
  465.     LSR.W    #2,D0
  466.     SUBQ.W    #1,D0
  467. .DC1    MOVE.L    (A0)+,D6
  468.     LSR.L    D5,D6
  469.     SWAP    D6
  470.     CLR.W    D6
  471.     MOVE.L    -2(A0),D1
  472.     LSR.L    D5,D1
  473.     AND.L    #$FFFF,D1
  474.     OR.L    D6,D1
  475.     MOVE.L    (A1)+,D6
  476.     LSR.L    D5,D6
  477.     SWAP    D6
  478.     CLR.W    D6
  479.     MOVE.L    -2(A1),D2
  480.     LSR.L    D5,D2
  481.     AND.L    #$FFFF,D2
  482.     OR.L    D6,D2
  483.     AND.L    D3,D1
  484.     AND.L    D3,D2
  485.     ADD.L    D1,D1
  486.     OR.L    D2,D1
  487.     MOVE.L    D1,(A3)+
  488.     DBF    D0,.DC1
  489.     RTS    
  490.  
  491.